INTO & MERGE
contents
1부: INTO 절
SQL에서 INTO는 방향을 나타내는 키워드입니다. 데이터베이스에게 데이터를 어디에 넣을지 알려줍니다. 함께 짝을 이루는 명령어에 따라 역할이 크게 달라집니다.
1. INSERT INTO (표준 데이터 삽입)
가장 흔한 사용법입니다. 어떤 테이블이 새로운 행(Row)을 받을지 지정합니다.
INSERT INTO Employees (id, name, salary)
VALUES (1, 'Alice', 50000);
2. SELECT ... INTO (테이블 생성 및 복사)
이것은 SELECT 쿼리의 결과를 이용해 새로운 테이블을 생성하고 동시에 데이터를 채워 넣는 매우 강력한 명령어입니다.
- 사용처: 데이터 분석을 위해 임시 테이블을 만들거나 빠른 백업을 생성할 때.
- 문법 (SQL Server / PostgreSQL):
-- 'IT_Employees'라는 새 테이블을 만들고
-- IT 부서 직원들의 데이터를 복사해 넣습니다.
SELECT id, name, salary
INTO IT_Employees
FROM Employees
WHERE department = 'IT';
- 참고: MySQL과 Oracle에서는 이 기능 대신
CREATE TABLE new_table AS SELECT...문법을 사용합니다.
3. 변수에 값 넣기 (스토어드 프로시저)
스토어드 프로시저(Oracle의 PL/SQL 등)를 작성할 때, INTO는 테이블에서 하나의 값을 꺼내 지역 변수(Variable) 에 저장할 때 사용됩니다.
-- (Oracle PL/SQL 예시)
DECLARE v_max_salary INT;
BEGIN
SELECT MAX(salary) INTO v_max_salary FROM Employees;
-- 이제 v_max_salary 변수를 로직에 사용할 수 있습니다.
END;
2부: MERGE 문 ("Upsert" 기능)
1. MERGE란 무엇인가?
MERGE 문은 INSERT, UPDATE, DELETE를 하나로 결합한 명령어입니다. 흔히 "Upsert" (Update + Insert의 합성어)라고 부릅니다.
타겟 테이블(수정하려는 원본 테이블)과 소스 테이블(새로 들어온 데이터)을 비교하여, 일치하는 데이터가 있는지 없는지에 따라 각기 다른 작업을 수행할 수 있게 해줍니다.
- 비유: 스마트폰 연락처 동기화
- 새 명단에는 있는데 내 폰에는 없는 사람 -> 추가 (INSERT).
- 내 폰에 있는 사람인데 새 명단에서 번호가 바뀜 -> 수정 (UPDATE).
- 내 폰에는 있는데 새 명단에서 삭제됨 -> 삭제 (DELETE).
2. MERGE의 구조
MERGE 문은 크게 4가지 부분으로 나뉩니다:
MERGE INTO target: 수정될 대상 테이블.USING source: 비교할 새 데이터 (소스).ON condition: 두 테이블을 연결할 조건 (주로 Primary Key).WHEN MATCHED / NOT MATCHED: 조건 일치 여부에 따른 행동 지시.
3. 실무 문법 예시
물류 창고를 상상해 보세요. 메인 Inventory(재고) 테이블이 있고, 매일 밤 DailyShipments(일일 입고) 테이블이 들어옵니다. 재고를 동기화해야 합니다.
MERGE INTO Inventory AS Target
USING DailyShipments AS Source
ON Target.ProductID = Source.ProductID
-- 시나리오 1: 창고에 이미 존재하는 상품인 경우.
-- 행동: 기존 수량에 새 수량을 더합니다 (UPDATE).
WHEN MATCHED THEN
UPDATE SET Target.Quantity = Target.Quantity + Source.Quantity
-- 시나리오 2: 창고에 한 번도 들어온 적 없는 신상품인 경우.
-- 행동: 창고 목록에 새로 추가합니다 (INSERT).
WHEN NOT MATCHED BY TARGET THEN
INSERT (ProductID, Quantity)
VALUES (Source.ProductID, Source.Quantity)
-- 시나리오 3 (선택 사항): 창고에는 있는데 오늘 입고 목록엔 없는 경우.
-- 행동: 재고 목록에서 삭제합니다 (또는 품절 처리).
WHEN NOT MATCHED BY SOURCE THEN
DELETE;
4. 데이터베이스별 지원 및 대안
MERGE는 ANSI SQL 표준이지만, DBMS 벤더마다 지원 방식이 다릅니다:
- SQL Server & Oracle: 표준
MERGE문법을 완벽히 지원합니다. - PostgreSQL: 버전 15부터
MERGE를 지원하며, 그 이전에는INSERT ... ON CONFLICT DO UPDATE를 사용했습니다. - MySQL:
MERGE를 지원하지 않습니다. 대신INSERT ... ON DUPLICATE KEY UPDATE를 사용해야 합니다.
5. MERGE의 장단점
- 장점 (성능):
INSERT,UPDATE,DELETE쿼리를 따로따로 날리면 DB가 테이블을 3번 스캔해야 하지만,MERGE를 사용하면 단 한 번의 스캔(Single Pass) 으로 모든 작업을 처리합니다. 대용량 데이터 동기화(ETL 작업)에 극도로 최적화되어 있습니다. - 단점: 문법이 길고 복잡하며, 인덱스가 제대로 걸려있지 않으면 테이블 잠금(Lock) 경합을 유발할 수 있습니다.
references